예제 #1
0
        private static void SetupLight(StateMachine light, HSREL8 hsrel8, HSPE8OutputOnly hspe8)
        {
            // Front lights (left, middle, right)
            var fl = hspe8[HSPE8Pin.GPIO0].WithInvertedState();
            var fm = hspe8[HSPE8Pin.GPIO2].WithInvertedState();
            var fr = hsrel8[HSREL8Pin.GPIO0].WithInvertedState();

            // Middle lights (left, middle, right)
            var ml = hspe8[HSPE8Pin.GPIO1].WithInvertedState();
            var mm = hspe8[HSPE8Pin.GPIO3].WithInvertedState();
            var mr = hsrel8[HSREL8Pin.GPIO1].WithInvertedState();

            // Rear lights (left, right)
            // Two mechanical relays.
            var rl = hsrel8[HSREL8Pin.GPIO5];
            var rr = hsrel8[HSREL8Pin.GPIO4];

            light.AddOffState()
            .WithLowBinaryOutput(fl)
            .WithLowBinaryOutput(fm)
            .WithLowBinaryOutput(fr)
            .WithLowBinaryOutput(ml)
            .WithLowBinaryOutput(mm)
            .WithLowBinaryOutput(mr)
            .WithLowBinaryOutput(rl)
            .WithLowBinaryOutput(rr);

            light.AddOnState()
            .WithHighBinaryOutput(fl)
            .WithHighBinaryOutput(fm)
            .WithHighBinaryOutput(fr)
            .WithHighBinaryOutput(ml)
            .WithHighBinaryOutput(mm)
            .WithHighBinaryOutput(mr)
            .WithHighBinaryOutput(rl)
            .WithHighBinaryOutput(rr);

            light.AddState("DeskOnly")
            .WithHighBinaryOutput(fl)
            .WithHighBinaryOutput(fm)
            .WithLowBinaryOutput(fr)
            .WithHighBinaryOutput(ml)
            .WithLowBinaryOutput(mm)
            .WithLowBinaryOutput(mr)
            .WithLowBinaryOutput(rl)
            .WithLowBinaryOutput(rr);

            light.AddState("CouchOnly")
            .WithLowBinaryOutput(fl)
            .WithLowBinaryOutput(fm)
            .WithLowBinaryOutput(fr)
            .WithLowBinaryOutput(ml)
            .WithLowBinaryOutput(mm)
            .WithLowBinaryOutput(mr)
            .WithLowBinaryOutput(rl)
            .WithHighBinaryOutput(rr);

            light.AlternativeStateId = StateMachineStateExtensions.OffStateId;
            light.ResetStateId       = StateMachineStateExtensions.OffStateId;
        }
예제 #2
0
        public IDevice CreateDevice(CCToolsDeviceType type, string id, int address)
        {
            if (id == null)
            {
                throw new ArgumentNullException(nameof(id));
            }

            var     i2CSlaveAddress = new I2CSlaveAddress(address);
            IDevice deviceInstance;

            switch (type)
            {
            case CCToolsDeviceType.HSPE16_InputOnly:
            {
                deviceInstance = new HSPE16InputOnly(id, i2CSlaveAddress, _i2CBusService, _log);
                break;
            }

            case CCToolsDeviceType.HSPE16_OutputOnly:
            {
                deviceInstance = new HSPE16OutputOnly(id, i2CSlaveAddress, _i2CBusService, _log);
                break;
            }

            case CCToolsDeviceType.HSPE8_InputOnly:
            {
                deviceInstance = new HSPE8InputOnly(id, i2CSlaveAddress, _i2CBusService, _log);
                break;
            }

            case CCToolsDeviceType.HSPE8_OutputOnly:
            {
                deviceInstance = new HSPE8OutputOnly(id, i2CSlaveAddress, _i2CBusService, _log);
                break;
            }

            case CCToolsDeviceType.HSRel5:
            {
                deviceInstance = new HSREL5(id, i2CSlaveAddress, _i2CBusService, _log);
                break;
            }

            case CCToolsDeviceType.HSRel8:
            {
                deviceInstance = new HSREL8(id, i2CSlaveAddress, _i2CBusService, _log);
                break;
            }

            case CCToolsDeviceType.HSRT16:
            {
                deviceInstance = new HSRT16(id, i2CSlaveAddress, _i2CBusService, _log);
                break;
            }

            default: throw new NotSupportedException();
            }

            return(deviceInstance);
        }
        private void SetupStairsCeilingLamps(IArea floor, HSPE8OutputOnly hspe8UpperFloor)
        {
            var output = new LogicalBinaryOutput()
                         .WithOutput(hspe8UpperFloor[HSPE8Pin.GPIO4])
                         .WithOutput(hspe8UpperFloor[HSPE8Pin.GPIO5])
                         .WithOutput(hspe8UpperFloor[HSPE8Pin.GPIO7])
                         .WithOutput(hspe8UpperFloor[HSPE8Pin.GPIO6])
                         .WithInvertedState();

            floor.WithLamp(Floor.LampStairsCeiling, output);

            floor.SetupTurnOnAndOffAutomation()
            .WithTrigger(floor.MotionDetector(Floor.StairsLowerMotionDetector), new AnimateParameter())
            .WithTrigger(floor.MotionDetector(Floor.StairsUpperMotionDetector))
            //.WithTrigger(floor.Button(Floor.ButtonStairsUpper))
            .WithTarget(floor.BinaryStateOutput(Floor.LampStairsCeiling))
            .WithOnDuration(TimeSpan.FromSeconds(10));

            var lamp = floor.Lamp(Floor.LampStairsCeiling);

            floor.Button(Floor.ButtonStairsUpper).GetPressedShortlyTrigger().Triggered += (s, e) =>
            {
                if (lamp.GetState() == BinaryActuatorState.On)
                {
                    lamp.TurnOff(new AnimateParameter().WithReversedOrder());
                }
                else
                {
                    lamp.TurnOn(new AnimateParameter());
                }
            };

            floor.Button(Floor.ButtonStairsLowerUpper).GetPressedShortlyTrigger().Triggered += (s, e) =>
            {
                if (lamp.GetState() == BinaryActuatorState.On)
                {
                    lamp.TurnOff(new AnimateParameter());
                }
                else
                {
                    lamp.TurnOn(new AnimateParameter().WithReversedOrder());
                }
            };
        }
예제 #4
0
        private void SetupStairsCeilingLamps(IArea room, HSPE8OutputOnly hspe8UpperFloor)
        {
            var output = new LogicalBinaryOutput()
                         .WithOutput(hspe8UpperFloor[HSPE8Pin.GPIO4])
                         .WithOutput(hspe8UpperFloor[HSPE8Pin.GPIO5])
                         .WithOutput(hspe8UpperFloor[HSPE8Pin.GPIO7])
                         .WithOutput(hspe8UpperFloor[HSPE8Pin.GPIO6])
                         .WithInvertedState();

            _actuatorFactory.RegisterLamp(room, Floor.LampStairsCeiling, output);

            _automationFactory.RegisterTurnOnAndOffAutomation(room, Floor.LampStairsCeilingAutomation)
            .WithTrigger(room.GetMotionDetector(Floor.StairsLowerMotionDetector))
            .WithTrigger(room.GetMotionDetector(Floor.StairsUpperMotionDetector))
            //.WithTrigger(floor.GetButton(Floor.ButtonStairsUpper).GetPressedShortlyTrigger())
            .WithTarget(room.GetStateMachine(Floor.LampStairsCeiling));

            var lamp = room.GetLamp(Floor.LampStairsCeiling);

            room.GetButton(Floor.ButtonStairsUpper).GetPressedShortlyTrigger().Triggered += (s, e) =>
            {
                if (lamp.GetState().Equals(BinaryStateId.On))
                {
                    lamp.SetState(BinaryStateId.Off, new AnimateParameter().WithReversedOrder());
                }
                else
                {
                    lamp.SetState(BinaryStateId.On, new AnimateParameter());
                }
            };

            room.GetButton(Floor.ButtonStairsLowerUpper).GetPressedShortlyTrigger().Triggered += (s, e) =>
            {
                if (lamp.GetState().Equals(BinaryStateId.On))
                {
                    lamp.SetState(BinaryStateId.Off, new AnimateParameter());
                }
                else
                {
                    lamp.SetState(BinaryStateId.On, new AnimateParameter().WithReversedOrder());
                }
            };
        }
예제 #5
0
        private void SetupStairsCeilingLamps(IArea room, HSPE8OutputOnly hspe8UpperFloor)
        {
            var output = new LogicalBinaryOutput()
                         .WithOutput(hspe8UpperFloor[HSPE8Pin.GPIO4])
                         .WithOutput(hspe8UpperFloor[HSPE8Pin.GPIO5])
                         .WithOutput(hspe8UpperFloor[HSPE8Pin.GPIO7])
                         .WithOutput(hspe8UpperFloor[HSPE8Pin.GPIO6])
                         .WithInvertedState();

            _actuatorFactory.RegisterLamp(room, Floor.LampStairsCeiling, output);

            _automationFactory.RegisterTurnOnAndOffAutomation(room, Floor.LampStairsCeilingAutomation)
            .WithTrigger(room.GetMotionDetector(Floor.StairsLowerMotionDetector))
            .WithTrigger(room.GetMotionDetector(Floor.StairsUpperMotionDetector))
            //.WithTrigger(floor.GetButton(Floor.ButtonStairsUpper).GetPressedShortlyTrigger())
            .WithTarget(room.GetLamp(Floor.LampStairsCeiling));

            var lamp = room.GetLamp(Floor.LampStairsCeiling);

            room.GetButton(Floor.ButtonStairsUpper).PressedShortTrigger.Attach(() => lamp.TryTogglePowerState());
            room.GetButton(Floor.ButtonStairsLowerUpper).PressedShortTrigger.Attach(() => lamp.TryTogglePowerState());
        }
예제 #6
0
        private void SetupLight(StateMachine light, HSREL8 hsrel8, HSPE8OutputOnly hspe8, IArea room)
        {
            // Front lights (left, middle, right)
            var fl = hspe8[HSPE8Pin.GPIO0].WithInvertedState();
            var fm = hspe8[HSPE8Pin.GPIO2].WithInvertedState();
            var fr = hsrel8[HSREL8Pin.GPIO0].WithInvertedState();

            // Middle lights (left, middle, right)
            var ml = hspe8[HSPE8Pin.GPIO1].WithInvertedState();
            var mm = hspe8[HSPE8Pin.GPIO3].WithInvertedState();
            var mr = hsrel8[HSREL8Pin.GPIO1].WithInvertedState();

            // Rear lights (left, right)
            // Two mechanical relays.
            var rl = hsrel8[HSREL8Pin.GPIO5];
            var rr = hsrel8[HSREL8Pin.GPIO4];

            light.AddOffState()
            .WithLowOutput(fl)
            .WithLowOutput(fm)
            .WithLowOutput(fr)
            .WithLowOutput(ml)
            .WithLowOutput(mm)
            .WithLowOutput(mr)
            .WithLowOutput(rl)
            .WithLowOutput(rr);

            light.AddOnState()
            .WithHighOutput(fl)
            .WithHighOutput(fm)
            .WithHighOutput(fr)
            .WithHighOutput(ml)
            .WithHighOutput(mm)
            .WithHighOutput(mr)
            .WithHighOutput(rl)
            .WithHighOutput(rr);

            var deskOnlyStateId = new ComponentState("DeskOnly");

            light.AddState(deskOnlyStateId)
            .WithHighOutput(fl)
            .WithHighOutput(fm)
            .WithLowOutput(fr)
            .WithHighOutput(ml)
            .WithLowOutput(mm)
            .WithLowOutput(mr)
            .WithLowOutput(rl)
            .WithLowOutput(rr);

            var couchOnlyStateId = new ComponentState("CouchOnly");

            light.AddState(couchOnlyStateId)
            .WithLowOutput(fl)
            .WithLowOutput(fm)
            .WithLowOutput(fr)
            .WithLowOutput(ml)
            .WithLowOutput(mm)
            .WithLowOutput(mr)
            .WithLowOutput(rl)
            .WithHighOutput(rr);

            light.WithTurnOffIfStateIsAppliedTwice();

            room.GetButton(Office.ButtonLowerRight)
            .GetPressedShortlyTrigger()
            .Attach(light.GetSetStateAction(couchOnlyStateId));

            room.GetButton(Office.ButtonLowerLeft)
            .GetPressedShortlyTrigger()
            .Attach(light.GetSetStateAction(deskOnlyStateId));

            room.GetButton(Office.ButtonUpperLeft)
            .GetPressedShortlyTrigger()
            .Attach(light.GetSetStateAction(BinaryStateId.On));

            _synonymService.AddSynonymsForArea(Room.Office, "Büro", "Arbeitszimmer");

            _synonymService.AddSynonymsForComponent(Room.Office, Office.CombinedCeilingLights, "Licht");
            _synonymService.AddSynonymsForComponent(Room.Office, Office.SocketRearLeftEdge, "Rotlicht", "Pufflicht", "Rot");

            _synonymService.AddSynonymsForComponentState(deskOnlyStateId, "Schreibtisch");
            _synonymService.AddSynonymsForComponentState(couchOnlyStateId, "Couch");
        }