Skip to content

Streaming

For continuous data flow, use RscpFlow directly with Akka.Streams channels.

Channel Materialization

csharp
var system = ActorSystem.Create("e3dc");
var materializer = system.Materializer();

var flow = RscpFlow.Create(
    () => new RscpConnection("192.168.1.100", 5033, "user", "pass", "key"),
    pollingTags: [RscpTag.EMS_REQ_POWER_PV, RscpTag.EMS_REQ_BAT_SOC],
    new RscpFlowSettings { PollingInterval = TimeSpan.FromSeconds(2) });

var (commands, messages) = flow.Materialize(materializer);

Async Enumeration

csharp
await foreach (var msg in messages.ReadAllAsync())
{
    if (msg is RscpDataResponse data)
    {
        var snapshot = data.ToEmsPowerSnapshot();
        if (snapshot is not null)
            Console.WriteLine($"PV={snapshot.PvWatts}W SOC={snapshot.Soc:F1}%");
    }
}

Sending On-Demand Commands

While polling runs automatically, you can also send one-off commands:

csharp
await commands.WriteAsync(
    RscpRequest.Create()
        .Read(Info.SerialNumber, Info.SwRelease));

Composing with Other Stages

The flow is a standard Flow<IRscpCommand, IRscpMessage, NotUsed> — compose it with any Akka.Streams stage:

csharp
var filtered = flow
    .Where(msg => msg is RscpDataResponse)
    .Select(msg => ((RscpDataResponse)msg).ToEmsPowerSnapshot())
    .Where(snapshot => snapshot is not null);

E3DC S10 Pro RSCP Client Library